//
// Created by Crestimes on 24-5-9.
//

#ifndef SCANNER_H
#define SCANNER_H
#include <vector>

#include "Token.h"

typedef enum {
    // token开始
    START,

    // 各种 token本身不止一个字符/只看一个字符无法分类/组成可以不止一个字符 的情况

    // >>>> 一个嵌套在这个 START->DONE 的大自动机里的 IN_REG->REG_DONE 的小自动机
    IN_REG,
    // 正则表达式中的一个token结束
    REG_DONE,
    // <<<<

    IN_NUM, // 数字
    IN_ID, // 变量或关键字
    IN_LT, // < 开头
    IN_GT, // > 开头
    IN_IGNORE, // 注释
    IN_ADD, // + 开头
    IN_SUB, // - 开头
    IN_EQU, // = 开头
    IN_EXP_EQ, // :=


    // token结束
    DONE,

    // error
    ERROR
}
StateType;


class Scanner {
public:
    explicit Scanner(std::string);

    std::vector<Token> getTokens();

private:
    std::string buffer;

    StateType state = START;

    std::string currentToken;
    TokenType currentTokenType = IGNORE;
};


#endif //SCANNER_H
